home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et3_0-a1.lha / et3 / src / Object.h < prev    next >
C/C++ Source or Header  |  1992-07-23  |  7KB  |  219 lines

  1. #ifndef Object_First
  2. #ifdef __GNUG__
  3. //pragma once
  4. #pragma interface
  5. #endif
  6. #define Object_First 
  7.  
  8. #include "Types.h"
  9. #include "Storage.h"
  10. #include "Stream.h"
  11.  
  12. class Object;
  13. class AccessMembers;
  14.  
  15. const int cIdNone           = -1,
  16.       cPartAnyChange    = 27;
  17.  
  18. typedef bool (*BoolFun)(Object*, Object*, void*);
  19. typedef Object* (*ObjPtrFun)(Object*, Object*, void*);
  20. typedef void (Object::*ObjMemberFunc)(...);
  21. typedef void (Object::*VoidObjMemberFunc)(...);
  22. typedef unsigned char (Object::*BoolObjMemberFunc)(...);
  23.  
  24. extern int gDebug;
  25.  
  26. //---- client flags -----------------------------------------------------
  27.  
  28. enum ObjFlags {
  29.     eObjIsDeleted   = BIT(0),
  30.     cObjIsShared    = BIT(1),
  31.     eObjDefault     = 0,
  32.     eObjLast        = 1
  33. };
  34.  
  35. //---- private flags, clients can only test but not set them ------------
  36.  
  37. const int cObjNonDeleted    =   0x01000000,
  38.       cObjDelayChanges  =   0x02000000,
  39.       cObjVisited       =   0x04000000,
  40.       cObjIsProto       =   0x08000000,
  41.       cObjIsObserved    =   0x10000000;
  42.  
  43. const int cFlagMask= 0x00ffffff;
  44.  
  45. //---- class Object -----------------------------------------------------
  46.  
  47. class Object {
  48. friend class Class;
  49.  
  50. public:
  51.     //---- automatically added by macro metaDef --------------------------------
  52.     static class Class *isa;
  53.     friend IStream &operator>> (IStream &s, Object *&op)
  54.     { return ::LoadPtr(s, op, Object::isa); }
  55.     friend class Class *_Type(Object*)
  56.     { return Object::isa; }
  57.     Object(class _dummy*);
  58.     virtual class Class *IsA();
  59.     virtual void Members(AccessMembers*);
  60.     //--------------------------------------------------------------------------
  61.     
  62. public:
  63.     Object(int f= eObjDefault);
  64.  
  65.     virtual ~Object();
  66.     virtual void FreeAll();
  67.  
  68.     //---- memory allocation
  69.     void *operator new (size_t sz)
  70.     { return Storage::ObjectAlloc(sz); }
  71.     void *operator new (size_t sz, char *file, int line)
  72.     { return Storage::ObjectAlloc(sz, file, line); }
  73.     void operator delete(void *vp)
  74.     { Storage::ObjectFree(vp); }
  75.  
  76. #   define IsKindOf(name) IsA()->isKindOf(Meta(name))
  77.  
  78.     //----- flag manipulation --------------------------------------------------
  79.     void SetFlag(int f, bool b);
  80.     void SetFlag(int f)
  81.     { flags|= f & cFlagMask; }
  82.     void ResetFlag(int f)
  83.     { flags&= ~(f & cFlagMask); }
  84.     bool TestFlag(int f)
  85.     { return (bool) ((flags & f) != 0); }
  86.     void InvertFlag(int f)
  87.     { flags^= f & cFlagMask; }
  88.  
  89.     //---- attributes ----------------------------------------------------------
  90.     char *ClassName();
  91.     void MarkAsDeleted()
  92.     { SetFlag(eObjIsDeleted); }
  93.     bool IsDeleted()
  94.     { return TestFlag(eObjIsDeleted); }
  95.     void SetVisited()
  96.     { flags|= cObjVisited; }
  97.     void ClearVisited()
  98.     { flags&= ~cObjVisited; }
  99.     bool IsObserved()
  100.     { return TestFlag(cObjIsObserved); }
  101.     bool IsShared()
  102.     { return TestFlag(cObjIsShared); }
  103.     void SetShared()
  104.     { SetFlag(cObjIsShared); }
  105.  
  106.     //---- comparing -----------------------------------------------------------
  107.     virtual u_long Hash();
  108.     virtual bool IsEqual (Object*);
  109.     virtual int Compare (Object*);
  110.  
  111.     //---- converting, activation passivation ----------------------------------
  112.     virtual char* AsString();
  113.     virtual OStream& PrintOn(OStream&);
  114.     virtual IStream& ReadFrom(IStream&);
  115.     virtual Object *ReadAndMap(IStream&);
  116.  
  117.     friend OStream &operator<< (OStream &os, Object &op)
  118.     { return op.PrintOn(os); }
  119.     friend IStream &operator>> (IStream &is, Object &op)
  120.     { return op.ReadFrom(is); }
  121.     friend IStream &LoadPtr(IStream &is, Object *&op, Class *staticclass);
  122.     friend OStream& operator<< (OStream &os, Object *op);
  123.  
  124.     //---- cloning -------------------------------------------------------------
  125.     Object* New();
  126.     virtual void InitNew();
  127.     virtual Object *Clone();
  128.     virtual Object *deepclone();
  129.     Object *DeepClone();
  130.  
  131.     //---- change propagation --------------------------------------------------
  132.     void AddObserver(Object*);
  133.     Object* RemoveObserver(Object*);
  134.     virtual void Send(int id= cIdNone, int part= cPartAnyChange, void *vp= 0);
  135.     virtual void DoObserve(int id, int part, void *vp, Object *op);
  136.     void Changed()
  137.     { Send(); }
  138.     class Iterator *GetObserverIter();
  139.     void DelayChanges();
  140.     void FlushChanges();
  141.     virtual bool PrintOnWhenObserving(Object *);
  142.  
  143.     //---- error handling ------------------------------------------------------
  144.     virtual void DoError(int level, char *location, char *fmt, va_list va);
  145.     void Error(char *method, char *msgfmt, ...);
  146.     void SysError(char *method, char *msgfmt, ...);
  147.     void Warning(char *method, char *msgfmt, ...);
  148.     void Fatal(char *method, char *msgfmt, ...);
  149.  
  150.     //---- fire walls ----------------------------------------------------------
  151.     void AbstractMethod(char*);
  152.     void MayNotUse(char*);
  153.     Object *guard(Class*);
  154. #   define Guard(p,name) ((name*)(p)->guard(Meta(name)))
  155.  
  156.     //---- inspecting, debugging -----------------------------------------------
  157.     void Inspect(bool block= FALSE);
  158.     void EditSource(bool declaration);
  159.     virtual void InspectorId(char *buf, int bufSize);
  160.     virtual void CollectParts(class Collection*);
  161.     void ScanMembers(u_long, ...);
  162.     // direct (unchecked) access to instance variables; returns address of variable
  163.     void* GetAddrOf(const char *varname, Class *&cl);
  164.  
  165. protected:
  166.     static int _an;
  167.     static class AccessMembers *_accessMembers;
  168.  
  169. protected:
  170.     //---- overridden if observers are stored in the object itself
  171.     virtual class Collection *MakeObserverColl();
  172.     virtual class Collection *GetObservers();
  173.     virtual void DestroyObserverColl();
  174.     virtual void SetObserverColl(Collection *);
  175.     void CleanupObservers(Collection *);
  176.  
  177. private:
  178.     u_int flags;
  179.     Object(const Object&);       
  180. };
  181.  
  182. //---- DoDelayChanges ----------------------------------------------------------
  183.  
  184. // to delay the calls to Changed and ChangedWhat an instance of the class
  185. // DelayChanges can be declared
  186. // eg: Text::Cut() { DelayChanges dc(this); ... }
  187.  
  188. class DoDelayChanges {
  189.     Object *op;
  190. public:
  191.     DoDelayChanges(Object *o)
  192.     { op= o; op->DelayChanges(); }
  193.     ~DoDelayChanges()
  194.     { op->FlushChanges(); }
  195. };
  196.  
  197. //---- MetaDef macros ----------------------------------------------------------
  198.  
  199. #define Meta(name) name::isa
  200. #define SMeta(name) _NAME2_(__isa__,name)
  201.  
  202. #define MetaDef(name)                                           \
  203.     name(class _dummy*);                                        \
  204.     static class Class *isa;                                    \
  205.     Class *IsA();                                               \
  206.     friend char *_NAME2_(name,DeclFileName)(char *p= __FILE__)  \
  207.     { return p; }                                           \
  208.     friend int _NAME2_(name,DeclFileLine)(int i= __LINE__)      \
  209.     { return i; }                                           \
  210.     friend IStream &operator>> (IStream &s, name *&op)          \
  211.     { return LoadPtr(s, (Object*&)op, Meta(name)); }        \
  212.     void Members(AccessMembers *ac);                            \
  213.     friend class Class *_Type(name*)                            \
  214.     { return Meta(name); }
  215.  
  216.  
  217. #endif
  218.  
  219.